/**
 * 常工方法类
 * 
 * @author fb
 */
var util = window.mofang.util;

util.date = {
	getWeek : function(date) {
		var weeks = {
			0 : '周日',
			1 : '周一',
			2 : '周二',
			3 : '周三',
			4 : '周四',
			5 : '周五',
			6 : '周六'
		};
		return weeks[date.getDay()] + '(' + date.format("MM-dd") + ')';
	},
	/**
	 * 时间格式只能是yyyy-MM-dd才行，用new Date(str)这样的格式ie7 8不兼容
	 */
	parseToDate : function(dateStringInRange) {
		var isoExp = /^\s*(\d{4})-(\d\d)-(\d\d)\s*$/, date = new Date(NaN), month, parts = isoExp
				.exec(dateStringInRange);

		if (parts) {
			month = +parts[2];
			date.setFullYear(parts[1], month - 1, parts[3]);
			if (month != date.getMonth() + 1) {
				date.setTime(NaN);
			}
		}
		return date;
	}
};

/**
 * @param key 获取字段的key
 * @param data 数据对象
 * @param unit 单位
 */
util.dataMergeCell = function(key, data, unit, align,tipSize) {
	var html = '<ul>';
	unit = unit || '';
	tipSize = tipSize? tipSize : 20;
	var cssStyle = 'style="min-height:25px;"';
	cssStyle = align? 'style="min-height:25px;text-align:'+align+'"' : cssStyle;
	$.each(data, function(i, line) {
		var text = ((line[key] + unit || '') + '').safeDispose();
		var margeCellCalss = 'table-mergeCell-li';
		if(data.length == i + 1){
			margeCellCalss =  "table-mergeCell-li-last" ;
		} 
		//添加_gird_overflow_tip 样式，供字数太多是Tip提示。
		html += '<li class="'+margeCellCalss+'"><div class="_gird_overflow_tip" tipSize="'+tipSize+'" '+cssStyle+'>' + text + '</div></li>';
	});

	return html + '</ul>';
};

// 判断字符串是否含有特殊字符
util.containSpecial = function(str) {
	var reg = /^[^@\/\'\\\"#$%&\^\*]+$/;
	if (reg.test(str)) {
		return true;
	} else {
		return false;
	}
};

// 阻止冒泡和浏览器默认行为
util.stopDefault = function(e) {
	if (e && e.stopPropagation) {
		e.stopPropagation();
	} else {
		// 否则，我们需要使用IE的方式来取消事件冒泡
		e.cancelBubble = true;
	}

	if (e && e.preventDefault) {
		e.preventDefault();
	} else {
		// IE中阻止函数器默认动作的方式
		e.returnValue = false;
	}

	return false;
};

// 把serializeArray获取的数据转换成struts能识别的数据格式
util.toFormJson = function(data) {
	var json = {};

	$.each(data, function() {
		if (json[this.name]) {
			if ($.isArray(json[this.name])) {
				json[this.name].push(this.value);
			} else {
				var values = [ json[this.name] ];
				values.push(this.value);
				json[this.name] = values;
			}
		} else {
			json[this.name] = this.value;
		}
	});

	return json;
};

util.serializeJson = function($from) {
	return util.toFormJson($from.serializeArray());
};

util.selectPadData = function(domMsgs, json) {
	$.each(domMsgs, function(i, dom) {
		if (json[dom.jsonObj]) {
			var $dom = $('#' + dom.domId);
			$.each(json[dom.jsonObj], function(i, data) {
				if (data) {
					if (dom.exclude && dom.exclude == data[dom.key]) {
						return;
					}

					var value = data[dom.value || 'name'].safeDispose();

					$dom.append('<option title="' + value + '" value="'
							+ data[dom.key || 'id'] + '">'
							+ value.substringName(30) + '</option>');
				}
			});
		}
	});
};

util.fileDownload = function(url, $from) {
	url = rootPath + '/' + url;
	// 每次文件下载前清除此cookie信息，防止文件下载一半时用户页面刷新而导致些cookie末正确删除问题
	document.cookie = "excelExport=; expires=" + new Date(1000).toUTCString()
			+ "; path=/";

	if ($('#fileDownFrame').length < 1) {
		$('body')
				.append(
						'<iframe style="display: none;" name ="fileDownFrame" id="fileDownFrame"></iframe>');
	}

	var srcUrl = $from.attr('url') || 'UTF-8';
	$from.attr('action', url);
	$from.attr('method', 'post');
	$from.attr('target', 'fileDownFrame');
	$from.submit();
	$from.attr('src', srcUrl);

	// 代替换
	 var loadObj = $.Prompt('<div id="mofang_loading" class="loading spin"></div>', 0, { bg : true });

	var checkFileDownloadComplete = function() {
		window.setTimeout(function() {
			if (document.cookie.indexOf('excelExport=true') != -1) {
				loadObj.fastClose();
				document.cookie = "excelExport=; expires="
						+ new Date(1000).toUTCString() + "; path=/";
			} else {
				checkFileDownloadComplete();
			}
		}, 200);
	};

	checkFileDownloadComplete();
};

/**
 * -- obj { src : { domId : select的id url : 数据请求的url，如果没有则不进行数据请求和select填充
 * params : params, key : url反回数据要填充的select 值 value : url反回数据要填充的select 显示名
 * dataKey : url反回json要获取的对象 }, desc : { domId : params : url : key : } }
 * 
 * 
 */
util.selectCascade = function(_obj) {
	var src = {
		domId : null,
		url : null,
		key : 'id',
		value : 'name'
	};
	var desc = {
		domId : null,
		url : null,
		key : 'id',
		value : 'name'
	};
	var defalutlKey = 'selectCascade';

	$.extend(src, _obj.src);
	$.extend(desc, _obj.desc);

	if (src.url) {
		util.mofangAjax({
			url : src.url,
			data : src.params,
			succFun : function(json) {
				src.dataKey || (json = {
					defalutlKey : json
				});
				util.selectPadData({
					domId : src.domId,
					jsonObj : (src.dataKey || defalutlKey),
					key : src.key,
					value : src.value
				}, json);
			}
		});
	}

	$('#' + src.domId).unbind('change').bind('change', function(e) {
		$('#' + desc.domId).html("<option value=''>-请选择-</option>");
		var params = $.extend({}, desc.params);

		for ( var _k in params) {
			params[_k] = this.value;
		}

		util.mofangAjax({
			url : desc.url,
			data : params,
			succFun : function(json) {
				desc.dataKey || (json = {
					defalutlKey : json
				});
				util.selectPadData([ {
					domId : desc.domId,
					jsonObj : (desc.dataKey || defalutlKey),
					key : desc.key,
					value : desc.value
				} ], json);
			}
		});
	});
};

util.load = function(url, success, _$) {

	if (pageLoad) {
		pageLoad.abort();
	}

	pageLoad = util.mofangAjax({
		dataType : 'html',
		url : url,
		async : false,
		succFun : function(_html) {
			if (_$) {
				_$.html(_html);
			}
			
			if (success) {
				success(_html);
			}
		}
	});

};

util.mofangAjax = function(param) {
	var params = {
		type : 'post',
		timestamp : new Date().getTime(),
		dataType : 'json',
		loading : true,
		async : true
	};
	$.extend(params, param);

	var obj = {};
	$.extend(obj, params);
	obj.url = rootPath + '/' + params.url;
	var loadObj =  null;

	if (param.succFun) {
		obj.success = function(resjson) {
			if (params.loading) {
				loadObj.fastClose();
			}
			if (resjson && resjson.error) {
				$.Prompt(resjson.error);
				return;
			}
			param.succFun.apply(null, [ resjson, params ]);
		};
	}
	if (params.errFun) {
		obj.error = function(request, textStatus, errorThrown) {
			if (params.loading) {
				// 移除小菊花
				$('#mofang_loading').remove();
				loadObj.fastClose();
			}

			param.errFun.apply(null,
					[ request, textStatus, errorThrown, params ]);
		};
	}

	obj.complete = function(request, textStatus) {

		if (request.responseText) {
			var istimeout = (params.dataType.toLowerCase() == "json")
					&& (request.responseText.indexOf('<login: value="登录页标示"/>') != -1);

			if (istimeout) {
				top.window.location.href = rootPath + "/login.koala";
			}
		}
		
		if (params.loading) {
			// 移除小菊花
			$('#mofang_loading').remove();
			loadObj.fastClose();
		}
		
		if (textStatus == 'error') {
			$.Prompt('ajax请求路径有误或服务器异常无法连接!');
		}

		if (params.complete) {
			param.complete.apply(null, [ request, textStatus, params ]);
		}
	};

	if (params.loading) {
		 loadObj = $.Prompt('<div id="mofang_loading" class="loading spin"></div>', 0, { bg : true });
	}
	
	return $.ajax(obj);
};

/**
 * *********************** 以下为自定义类和原生方法扩展
 */
String.prototype.trim = function() {
	return this.replace(/(^\s*)|(\s*$)/g, "");
};

// 判断字符串长度是否超出范围 n 字符个数(1个汉字占2字符,gbk编码)
String.prototype.isOutSize = function(n) {
	var w = 0;
	for ( var i = 0; i < this.length; i++) {
		var c = this.charCodeAt(i);
		if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
			w++;
		} else {
			w += 2;
		}
	}
	return w > n;
};

String.prototype.safeDispose = function() {
	var specialCharacts = {
		'&' : '&amp;',
		'\'' : '&#39;',
		'\"' : '&quot;',
		'<' : '&lt;',
		'>' : '&gt;'
	};
	var value = this.toString();

	for ( var key in specialCharacts) {
		value = value.replace(new RegExp(key, 'g'), specialCharacts[key]);
	}

	return value;
};

/*
 * 截取字符串长度 n 字符个数
 */
String.prototype.substringName = function(n) {
	if (this.isOutSize(n)) {
		var w = 0;
		var str = '';
		for ( var i = 0; i < this.length; i++) {
			var c = this.charCodeAt(i);
			if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
				w++;
			} else {
				w += 2;
			}
			if (w > n) {
				break;
			}
			str += this.charAt(i);
		}
		return str + "...";
	} else {
		return this.toString();
	}
};

// 自定义的对象,模拟java的stringBuilder类
function StringBuilder(str) {
	this._stringBuilder = [];
	if (str)
		this._stringBuilder.push(str);
}
StringBuilder.prototype = {
	append : function(str) {
		this._stringBuilder.push(str);
		return this;
	},
	empty : function() {
		this._stringBuilder = [];
	},
	toString : function() {
		return this._stringBuilder.join('');
	}
};

// 对Date的扩展，将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子：
// (new Date()).format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.format = function(fmt) {
	var o = {
		"M+" : this.getMonth() + 1, // 月份
		"d+" : this.getDate(), // 日
		"h+" : this.getHours(), // 小时
		"m+" : this.getMinutes(), // 分
		"s+" : this.getSeconds(), // 秒
		"q+" : Math.floor((this.getMonth() + 3) / 3), // 季度
		"S" : this.getMilliseconds()
	// 毫秒
	};
	if (/(y+)/.test(fmt))
		fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "")
				.substr(4 - RegExp.$1.length));
	for ( var k in o)
		if (new RegExp("(" + k + ")").test(fmt))
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k])
					: (("00" + o[k]).substr(("" + o[k]).length)));
	return fmt;
};

Date.prototype.getWeekFirstDay = function() {
	var _this = this;
	if (this.getDay() == 0) {
		_this = new Date(this).addDay(-1);
	}
	return new Date(_this - (_this.getDay() - 1) * 86400000);
};

Date.prototype.getWeekLastDay = function() {
	var _this = this;
	if (this.getDay() == 0) {
		_this = new Date(this).addDay(-1);
	}
	return new Date((_this.getWeekFirstDay() / 1000 + 6 * 86400) * 1000);
};

Date.prototype.getMonthFirstDay = function() {
	return new Date(this.getFullYear(), this.getMonth(), 1);
};

Date.prototype.getMonthLastDay = function() {
	var monthNextFirstDay = new Date(this.getFullYear(), this.getMonth() + 1, 1);
	return new Date(monthNextFirstDay - 86400000);
};

Date.prototype.addDay = function(day) {
	var date = new Date(this);
	date.setDate(date.getDate() + day);
	return date;
};

Date.prototype.addWeek = function(week) {
	return new Date(this.getTime() + 86400000 * 7 * week);
};

Date.prototype.weekOfYear = function() {
	var totalDays = 0;
	years = this.getFullYear();

	if (years < 1000) {
		years += 1900;
	}

	var days = new Array(12);
	days[0] = 31;
	days[2] = 31;
	days[3] = 30;
	days[4] = 31;
	days[5] = 30;
	days[6] = 31;
	days[7] = 31;
	days[8] = 30;
	days[9] = 31;
	days[10] = 30;
	days[11] = 31;

	// 判断是否为闰年，针对2月的天数进行计算
	if (Math.round(this.getFullYear() / 4) == this.getFullYear() / 4) {
		days[1] = 29;
	} else {
		days[1] = 28;
	}

	if (this.getMonth() == 0) {
		totalDays = totalDays + this.getDate();
	} else {
		var curMonth = this.getMonth();

		for ( var count = 1; count <= curMonth; count++) {
			totalDays = totalDays + days[count - 1];
		}

		totalDays = totalDays + this.getDate();
	}

	// 得到第几周
	var week = Math.round(totalDays / 7) + 1;
	return week;
};

/**
 * *********************** 以下为公用方法
 */
String.prototype.getByteLen = function() {
	var val = this;
	var len = 0;
	for ( var i = 0; i < val.length; i++) {
		if (val[i].match(/[^x00-xff]/ig) != null) // 全角
			len += 2;
		else
			len += 1;
	}
	;
	return len;
};

/**
 * 扩展方法
 * 如果data为空则显示'无'
 * */
template.helper('empty', function (data) {
    return (data || '无');
});
template.helper('dealNullNumber', function(data){
	return (data || '0');
});
template.helper('dealRate', function(data){
	if (data >= 90) {
		return '<font color="green">' + data + '%</font>';
	} else if (data < 70) {
		return '<font color="red">' + data + '%</font>';
	} else {
		return '<font color="blue">' + data + '%</font>';
	}
});
Date.prototype.format = function(format) {
	var o = {
		"M+" : this.getMonth() + 1, // month
		"d+" : this.getDate(), // day
		"h+" : this.getHours(), // hour
		"m+" : this.getMinutes(), // minute
		"s+" : this.getSeconds(), // second
		"q+" : Math.floor((this.getMonth() + 3) / 3), // quarter
		"S" : this.getMilliseconds()
	// millisecond
	}

	if (/(y+)/.test(format)) {
		format = format.replace(RegExp.$1, (this.getFullYear() + "")
				.substr(4 - RegExp.$1.length));
	}

	for ( var k in o) {
		if (new RegExp("(" + k + ")").test(format)) {
			format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k]
					: ("00" + o[k]).substr(("" + o[k]).length));
		}
	}
	return format;
}